let TimeUtil = require("./util/TimeUtil");
let Config = require("./util/Config");
let UI = require("./util/UI");
let logger = require("./util/Logger");
let DateConstants = require("./util/DateConstants");

const TARGET_PKG = "cn.com.livelab";

// 检查无障碍服务是否已经启用，如果没有启用则跳转到无障碍服务启用界面，并等待无障碍服务启动；当无障碍服务启动后脚本会继续运行。
auto.waitFor();

logger.info(`输出当前配置: ${JSON.stringify(Config.getConfig())}`);

// 老误触console区域 先关了再说
if (Config.isDebug()) {
    // 打开控制台界面 自动关闭
    console.show(true);
    console.setTitle("纷玩岛 go!", "#ff11ee00", 30);
}

//打开纷玩岛app
if (app.launch(TARGET_PKG)) {
    logger.info("启动成功...");
    // sys.watchOnClose(TARGET_PKG, 3000);
    try {
        main();
    } catch (e) {
        logger.error(`异常信息: ${e.message}`);
        logger.error(`堆栈信息: ${e.stack}`);
    }
} else {
    logger.error("启动失败...");
}

function waitForActivityStart() {
    // 售票时间
    let sellTime = getActivityOpenTime();
    // 开始抢票时间 减去45ms 用作网络延迟
    let startGrabbing = sellTime - 500;
    while (true) {
        let currentTimestamp = TimeUtil.local.getTime();
        logger.info(`当前时间: ${currentTimestamp}`);
        let diff = startGrabbing - currentTimestamp;
        logger.info(`离抢票开启还有${diff}毫秒`);
        toast(`离抢票开启还有${diff}毫秒`);
        if (diff >= 10 * DateConstants.SECOND) {
            UI.randWait(5 * DateConstants.SECOND, 10 * DateConstants.SECOND);
        } else {
            break;
        }
    }
}

function main() {
    // 只抢票的话 提前打开应用 待在抢票页面就行
    if (!Config.onlyGrabTickets()) {
        // 等待一会 等app加载好
        UI.randWait(1000, 3000);

        // 点击开屏的跳过按钮
        clickSkipButton();

        // 关闭首页弹窗广告
        UI.randWait(1000, 3000);
        closePopupAd();

        // 搜索目标
        UI.randWait(500, 1000);
        if (Config.search()) {
            let keywords = rawInput("请输入搜索关键词: ", Config.searchKeyWords());
            while (!keywords) {
                logger.info("等待用户输入...");
                UI.wait(1000);
            }
            while (!search(keywords)) {
                if (confirm("是否继续?")) {
                    continue;
                }
                break;
            }
        }
    }

    // 这里默认已经预填了信息 直接点击确认
    alert("开始抢票, 请确保已经预约和预填信息!!!");
    UI.wait(1000);

    let options = ["常规", "组队"];
    let selectIdx = -1;
    while (selectIdx < 0 || selectIdx >= options.length) {
        selectIdx = dialogs.select("请选择脚本场景: ", options);
    }
    logger.info(`脚本行为选择: ${options[selectIdx]}`);

    waitForActivityStart();

    if (selectIdx === 0) {
        // patch 1 常规抢票
        // 购票页面点击购票
        while (true) {
            if (className("android.view.View").desc("立即购买").exists()) {
                UI.randClick(className("android.view.View").desc("立即购买").findOne());
                logger.info("点击立即购买...");
                break;
            }
        }

        while (true) {
            if (className("android.view.View").desc("确认").exists()) {
                UI.randClick(className("android.view.View").desc("确认").findOne());
                logger.info("点击确认信息...");
            }

            if (className("android.view.View").desc("一键抢票").exists()) {
                // UI.randClick(className("android.view.View").desc("一键抢票").findOne());
                // 提高点击频次
                UI.randPress(className("android.view.View").desc("一键抢票").findOne(), random(1, 5));
                logger.info("点击抢票...");
            }

            if (className("android.widget.Button").desc("去支付").exists()) {
                logger.info("抢票成功, 待支付...");
                break;
            }

            if (Config.grabWait() > 0) {
                UI.randWait(0, Config.grabWait());
            }
        }
    } else {
        // patch 2 队伍抢票
        while (true) {
            if (className("android.view.View").desc("一键抢票").exists()) {
                // UI.randClick(className("android.view.View").desc("一键抢票").findOne());
                // 提高点击频次
                UI.randPress(className("android.view.View").desc("一键抢票").findOne(), random(1, 5));
                logger.info("点击抢票...");
            }

            if (className("android.widget.Button").desc("确定").exists()) {
                UI.randClick(className("android.widget.Button").desc("确定").findOne());
                logger.info("关掉缺票提示...");
            }

            if (className("android.widget.Button").desc("去支付").exists()) {
                logger.info("抢票成功, 待支付...");
                break;
            }

            if (Config.grabWait() > 0) {
                UI.randWait(0, Config.grabWait());
            }
        }
    }
}

/**
 * 输入售票时间
 */
function inputSellTime() {
    let sellTime = rawInput("请输入抢票时间(按照默认格式)", TimeUtil.formatTimestamp(TimeUtil.local.getTime()));
    return TimeUtil.convertDate(sellTime).getTime();
}

/**
 * 点击开屏跳过按钮
 */
function clickSkipButton() {
    // 5秒内找不到 默认已经点击过跳过了
    let skipButton = className("android.view.View").descStartsWith("跳过").findOne(5000);
    if (skipButton) {
        logger.info("点击跳过按钮...");
        UI.randWait(100, 1000);
        UI.randClick(skipButton);
    } else {
        logger.warn("跳过按钮查询超时，跳过流程...");
    }
}

/**
 * 关闭开屏弹窗广告
 */
function closePopupAd() {
    // 先等弹窗广告图片控件加载出来
    className("android.widget.ImageView").waitFor();
    let adCloseButton = className("android.widget.Button").findOne(5000);
    if (adCloseButton) {
        logger.info("点击关闭广告按钮...");
        UI.randWait(100, 1000);
        UI.randClick(adCloseButton);
    } else {
        logger.warn("关闭广告按钮查询超时，跳过流程...");
    }
}

/**
 * 查询
 * @param keywords
 */
function search(keywords) {
    // fixme: 输入框控件 但是没找到好的方式 去找到这个空间
    let searchArea = className("android.view.View").scrollable(true).depth(12).findOne().parent();
    UI.randWait(100, 500);
    // 就挺离谱的 click不行 得press 难道是duration太长了
    UI.randClick(searchArea);

    // 输入关键字
    UI.randWait(100, 500);
    className("android.widget.EditText").findOne().setText(keywords);

    // 等待查询结果
    UI.randWait(1000, 3000);
    let searchResult = className("android.view.View").descContains(keywords).find().filter(it => {
        return it.desc() !== keywords;
    });
    logger.info(`查询到与关键词: ${keywords} 相关记录${searchResult.length}条`);
    // 没数据直接返回
    if (searchResult.length === 0) {
        // 返回界面
        return return2Home();
    }
    searchResult.forEach(it => {
        logger.info(`符合条件的记录: ${it.desc()}`);
    });

    // 等待搜索结果加载出来 二次确认后 抢票
    let showButton = className("android.view.View").descStartsWith("演出").findOne();
    UI.randWait(500, 1000);
    UI.randClick(showButton);

    UI.wait(3000);
    let confirmResult = confirm("确定是下面第一个演出吗?");
    if (confirmResult) {
        UI.randWait(500, 1000);
        UI.randClick(className("android.widget.ImageView").descContains(keywords).findOne());
        return true;
    } else {
        return return2Home();
    }

    function return2Home() {
        UI.randWait(100, 500);
        UI.randClick(className("android.widget.Button").desc("取消").findOne());
        return false;
    }
}

/**
 * 获取售票时间
 *
 * 优先使用页面时间 其次手动输入保底
 */
function getActivityOpenTime() {
    // 售票时间
    let sellTime;
    // 尝试从页面提取售票时间
    let activityNotReady = className("android.view.View").descContains("开抢").exists();
    if (activityNotReady) {
        let dateString = className("android.view.View").descContains("开抢").findOne().desc();
        logger.info(`控件内容: ${dateString}`);
        let match = dateString.match(/^\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}/);
        let extractDateString = match ? match[0] : "";
        logger.info(`页面获取售票时间: ${extractDateString}`);
        sellTime = TimeUtil.convertDate(extractDateString).getTime();
    } else {
        sellTime = inputSellTime();
        logger.info(`输入的抢票时间: ${TimeUtil.formatTimestamp(sellTime)}`);
    }
    return sellTime;
}
